const axios = require('axios');

// 调试PLC服务访问控制的脚本

async function debugAccessControl() {
    try {
        console.log('调试PLC服务访问控制...\n');
        
        // 1. 模拟来自前端的直接请求（应该被拒绝）
        console.log('1. 模拟来自前端的直接请求:');
        try {
            const frontendResponse = await axios.post('http://localhost:3002/api/plc/read', {
                variables: ['DB122,X0.6']
            }, {
                headers: {
                    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
                    'Origin': 'http://localhost:5175', // 前端端口
                    'Referer': 'http://localhost:5175/'
                }
            });
            console.log('   ❌ 前端直接请求被允许了:', frontendResponse.data);
        } catch (error) {
            if (error.response && error.response.status === 403) {
                console.log('   ✅ 前端直接请求被正确拒绝:', error.response.data.message);
            } else {
                console.log('   ⚠️  前端直接请求返回了意外错误:', error.message);
            }
        }
        
        console.log('\n-------------------\n');
        
        // 2. 模拟来自Node-RED的请求（应该被拒绝）
        console.log('2. 模拟来自Node-RED的请求:');
        try {
            const nodeRedResponse = await axios.post('http://localhost:3002/api/plc/read', {
                variables: ['DB122,X0.6']
            }, {
                headers: {
                    'User-Agent': 'Node-RED',
                    'Origin': 'http://localhost:1880', // Node-RED端口
                    'Referer': 'http://localhost:1880/'
                }
            });
            console.log('   ❌ Node-RED直接请求被允许了:', nodeRedResponse.data);
        } catch (error) {
            if (error.response && error.response.status === 403) {
                console.log('   ✅ Node-RED直接请求被正确拒绝:', error.response.data.message);
            } else {
                console.log('   ⚠️  Node-RED直接请求返回了意外错误:', error.message);
            }
        }
        
        console.log('\n-------------------\n');
        
        // 3. 模拟来自队列服务的请求（应该被允许）
        console.log('3. 模拟来自队列服务的请求:');
        try {
            const queueServiceResponse = await axios.post('http://localhost:3002/api/plc/read', {
                variables: ['DB122,X0.6']
            }, {
                headers: {
                    'User-Agent': 'queue-service',
                    'Origin': 'http://localhost:3003', // 队列服务端口
                    'Referer': 'http://localhost:3003/'
                }
            });
            console.log('   ✅ 队列服务请求被允许:', queueServiceResponse.data);
        } catch (error) {
            if (error.response && error.response.status === 403) {
                console.log('   ❌ 队列服务请求被错误拒绝:', error.response.data.message);
            } else {
                console.log('   ⚠️  队列服务请求返回了意外错误:', error.message);
            }
        }
        
        console.log('\n-------------------\n');
        
        // 4. 模拟不带任何标识的请求（应该被拒绝）
        console.log('4. 模拟不带任何标识的请求:');
        try {
            const anonymousResponse = await axios.post('http://localhost:3002/api/plc/read', {
                variables: ['DB122,X0.6']
            });
            console.log('   ❌ 匿名请求被允许了:', anonymousResponse.data);
        } catch (error) {
            if (error.response && error.response.status === 403) {
                console.log('   ✅ 匿名请求被正确拒绝:', error.response.data.message);
            } else {
                console.log('   ⚠️  匿名请求返回了意外错误:', error.message);
            }
        }
        
        console.log('\n-------------------\n');
        
        // 5. 访问公共端点（应该被允许）
        console.log('5. 访问公共端点:');
        try {
            const statusResponse = await axios.get('http://localhost:3002/api/plc/status');
            console.log('   ✅ 公共端点访问成功:', statusResponse.data);
        } catch (error) {
            console.log('   ❌ 公共端点访问失败:', error.message);
        }
        
        console.log('\n-------------------\n');
        console.log('调试完成。请检查PLC服务控制台输出以获取详细信息。');
        
    } catch (error) {
        console.error('调试过程中出现错误:', error.message);
    }
}

// 如果直接运行此脚本，则执行调试
if (require.main === module) {
    debugAccessControl();
}

module.exports = {
    debugAccessControl
};